using namespace std;
bool sub[1<<20];
int dp[1<<20];
char mp[20][20];
int main(){
int t;for(cin>>t;t--;){
int n;memset(mp,0,sizeof(mp));cin>>n;
memset(sub,0,sizeof(sub));
for(int i=0 ; i < n ; i++)
scanf("%s",mp[i]);
int len=(1<<n) -1;
//求连通子集
for(int i=1; i<=len ; i++){
for(int j=0 ; j<n ; j++)
if((i>>j)&1){
for(int k=0 ; k<n ;k++){
if(sub[i])break;
if((i>>k)&1 && mp[j][k]=='1'){
sub[i]=1;break;
}
if(sub[i])break;
}
}
}
memset(dp,0X3f3f3f,sizeof(dp));
dp[0]=0;
//求子集的子集
for(int i=1 ; i<=len ; i++){
for(int j=i ; j ; j=(j-1)&i){
if(!sub[j]){
dp[i]=min(dp[i],dp[i ^ j]+1);
}
}
}
unsigned int pre=1 , ans=0;
for(int i=1 ; i<=len ; i++){
pre*=233;
ans+=pre*dp[i];
}
printf("%u\n",ans);
}
return 0;
}